﻿// See https://aka.ms/new-console-template for more information

using FactoryLib.abstracts;
using FactoryLib.services.AbstractFactory;
using FactoryLib.services.Factory;
using FactoryLib.services.Map;
using FactoryLib.services.NormalFactory;
using FactoryLib.services.SimpleFactory;

// 初始化王者地图
Map map = Map.GetInstance();
map.InitMap();

#region 自由发挥
//Ihero sun = new HeroSunWukong();
//Ihero ali = new HeroAli();
//Ihero luban = new HeroLuBan();
//Ihero make = new HeroMarkBoluo();
//sun.Say();
//ali.Say();
//luban.Say();
//make.Say();
#endregion

#region Ques1:代码是不是不太好看，可能有优化的空间-
SimpleHeroFactory simpleFactory = new SimpleHeroFactory();
Ihero sun1 = simpleFactory.CreatHero("sun");
Ihero ali1 = simpleFactory.CreatHero("ali");
Ihero luban1 = simpleFactory.CreatHero("luban");
Ihero make1 = simpleFactory.CreatHero("make");
sun1.Say();
ali1.Say();
luban1.Say();
make1.Say();
#endregion

#region Ques2:如果发现英雄越来越多了，怎么办？有没有方式在不侵入原有代码的基础上实现（开闭原则）
//InormalHeroFactory normalFacory = new NormalFactory();
//normalFacory.AddProvider(new HeroLiubeiProvider());
//var liubei = normalFacory.CreatHero();
//liubei.Say();

//normalFacory.AddProvider(new HeroZhaoyunProvider());
//var 赵云 = normalFacory.CreatHero();
//赵云.Say();
#endregion

#region 组装英雄
List<Ihero> heros = new List<Ihero>();
//heros.Add(sun);
//heros.Add(ali);
//heros.Add(luban);
//heros.Add(make);

//heros.Add(sun1);
//heros.Add(ali1);
//heros.Add(luban1);
//heros.Add(make1);

//heros.Add(liubei);
//heros.Add(赵云);
#endregion

#region Ques3：现在基本上完成了游戏的加载，好了，现在快到五一了，游戏需要新的一套新的主题，音乐，充值活动等，各位召唤师该如何编写代码？（前提：主题，音乐，充值活动，理解成同一层级的对象）
// 1。if(当前时间 == 五一)
// {
// 加载五一游戏主题
// 加载五一游戏音乐
// 加载五一游戏充值活动
// }
// else
// {
// 加载日常游戏主题
// 加载日常游戏音乐
// 加载日常游戏充值活动
// }

// 2. 在GameFactory中 在加载模块的同事增加 if else分支

// 主要是解决“系列对象”的需求变化，也就是对特定的工厂有特殊的需求，抽象工厂就是为了创建一些列的对象，或者叫相关产品簇的对象
IGameFactory game1 = new AbstractGameFactory();
game1.initprovider(new MaydayGameProvider(heros));
game1.loadResource();

//var game2 = game1;
//game2.initprovider(new QiXiFestivalGameProvider(heros));
//game2.loadResource();
#endregion
//GameFactory gameFactory = new GameFactory(heros);
//gameFactory.GameStart();
//gameFactory.GameEnd();

Console.ReadKey();